/*******************************************************************************
  * @file                   stepper.h
  * @Author:                MQjehovah                 mail:MQjehovah@hotmail.com
  * @version                1.0.0
  * @date                   2018/01/23
  * @brief                  
  ******************************************************************************
  * @attention
*******************************************************************************/
#ifndef __STEPPER_H
#define __STEPPER_H
/* Includes ------------------------------------------------------------------*/
#include "bsp.h"
/* Definition ----------------------------------------------------------------*/
#define STEP_TIM TIM2

#define STEP_EN GPIO_SetBits(GPIOB, GPIO_Pin_4)

#define ANGEL_PER_STEP (1.8f)                       //步距角1.8°
#define STEP_PER_CIRCLE (360 / ANGEL_PER_STEP)      //电机转动一圈的步数
#define STEP_DIV (4)                                //电机驱动细分值
#define PUL_PER_CIRCLE (STEP_PER_CIRCLE * STEP_DIV) //电机转动一圈的脉冲数
#define ACC_TIME 500                                //整个加速（或减速）过程持续的时间，由用户指定，控制电机加减速的快慢，单位ms
#define ACC_TIME_DIV 100                            //加速阶段离散的点的个数
#define TIME_PER_DIV ACC_TIME / ACC_TIME_DIV        //每个离散点持续的时间

#define STEP_MIN_FREQ 2000 //电机最小驱动频率
#define STEP_MAX_FREQ 10000 //电机最大驱动频率

typedef enum {
    acc,
    avg,
    dec
} STEP_STATE; //电机运行状态机

typedef struct
{
    u8 id;      //电机id
    u8 dir_pos; //电机正向方向（顺时针）
    u16 div;    //电机驱动细分
    
	u8 running; //标记电机是否在运行
    u8 en;
    u8 dir;
    u32 step;
//    u32 speed;
//    u32 target_speed;

    u32 current_puase; //当前的脉冲数
    u32 current_step;  //当前的步数
    u32 passed_puase;  //走过的脉冲数
    u32 passed_step;   //走过的步数

    u32 target_puase; //设置的目标步数

    //u32 f_puase;     //当前频率脉冲数（本算法S型加减速的过程是离散的，每个点（频率）运行一定步数）
    u16 f_index;     //当前频率在表中所处位置（）
	u32 avg_step; //匀速阶段步数


    u32 step_time; //在某一频率离散点持续的时间
    
    TIM_TypeDef *TIMx; //电机的驱动定时器
    STEP_STATE state;
} STEPPER;
/* Exported ------------------------------------------------------------------*/
extern STEPPER *pmotor;

extern STEPPER stepper;
void stepper_tim_init(u16 arr, u16 psc);
void stepper_pwm_init(u16 arr, u16 psc);
void stepper_set_enable(u8 value);
void stepper_set_dir(u8 value);
void Motor_PWM_Init(void);

#endif
/*********************************END OF FILE**********************************/
